package br.com.sixsoftware.helpdesk.view;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;

import br.com.sixsoftware.helpdesk.business.SolicitacaoServicoBC;
import br.com.sixsoftware.helpdesk.domain.Cliente;
import br.com.sixsoftware.helpdesk.domain.SolicitacaoServico;
import br.com.sixsoftware.helpdesk.exception.NegocioException;
import br.com.sixsoftware.helpdesk.util.SessaoUsuario;

@Named
@SessionScoped
public class ManterSolicitacaoServicoMB implements Serializable {

	private static final long serialVersionUID = 1L;

	@Inject
	private FacesContext facesContext;

	@Inject
	private SessaoUsuario sessaoUsuario;

	@Inject
	private SolicitacaoServicoBC solicitacaoServicoBC;

	private SolicitacaoServico solicitacaoServico;

	private List<SolicitacaoServico> listaSolicitacaoServicos;

	private String observacaoSolicitacaoServico;

	public ManterSolicitacaoServicoMB() {
		solicitacaoServico = new SolicitacaoServico();
		listaSolicitacaoServicos = new ArrayList<SolicitacaoServico>();
	}

	public String preInserirSolicitacaoServico() {
		solicitacaoServico = new SolicitacaoServico();
		return "manterSolicitacaoServico.xhtml";
	}

	public String preListarTodosSolicitacaoServicoCliente() {
		listaSolicitacaoServicos.clear();
		observacaoSolicitacaoServico = "";
		try {
			listaSolicitacaoServicos.addAll(solicitacaoServicoBC
					.listarTodosSolicitacaoServicosCliente((Cliente) (sessaoUsuario.getUsuarioAtual())));
		} catch (NegocioException ne) {
			facesContext.addMessage("", new FacesMessage(FacesMessage.SEVERITY_ERROR, ne.getMessage(), null));
		}
		return "listarTodasSolicitacaoServicoCliente.xhtml";
	}

	public String preListarTodosSolicitacaoPendente() {
		listaSolicitacaoServicos.clear();
		observacaoSolicitacaoServico = "";
		try {
			listaSolicitacaoServicos.addAll(solicitacaoServicoBC.listarTodosSolicitacaoServicosPendente());
		} catch (NegocioException ne) {
			facesContext.addMessage("", new FacesMessage(FacesMessage.SEVERITY_ERROR, ne.getMessage(), null));
		}
		return "listarTodasSolicitacaoServicoPendentes.xhtml";
	}

	public int getQuantidadeSolicitacaoServico() {
		return listaSolicitacaoServicos.size();
	}

	public String inserirSolicitacaoServico() {
		try {
			solicitacaoServicoBC.inserirSolicitacaoServico(solicitacaoServico);
			facesContext.addMessage("", new FacesMessage(FacesMessage.SEVERITY_INFO,
					"Solicitação de serviço cadastrada com sucesso", null));
			solicitacaoServico = new SolicitacaoServico();
			return "index.xhtml";
		} catch (NegocioException ne) {
			facesContext.addMessage("", new FacesMessage(FacesMessage.SEVERITY_ERROR, ne.getMessage(), null));
			return "manterSolicitacaoServico.xhtml";
		}
		
	}

	public String alterarSolicitacaoServico() {
		try {
			if (!solicitacaoServico.getEhNecessarioInformacoesAdicionais()) {
				solicitacaoServicoBC.alterarSolicitacaoServico(solicitacaoServico);
				facesContext.addMessage("", new FacesMessage(FacesMessage.SEVERITY_INFO,
						"Solicitação de serviço alterada com sucesso", null));
			} else {
				solicitacaoServicoBC.alterarSolicitacaoServico(solicitacaoServico, observacaoSolicitacaoServico);
				facesContext.addMessage("", new FacesMessage(FacesMessage.SEVERITY_INFO,
						"As informações complementares foram enviadas com sucesso", null));
			}
		} catch (NegocioException ne) {
			facesContext.addMessage("", new FacesMessage(FacesMessage.SEVERITY_ERROR, ne.getMessage(), null));
			return "manterSolicitacaoServico.xhtml";
		}
		return "index.xhtml";
	}

	public String preAtenderSolicitacaoServico() {
		observacaoSolicitacaoServico = "";
		return "atenderSolicitacaoServico.xhtml";
	}

	public String preAlterarSolicitacaoServico() {
		observacaoSolicitacaoServico = "";
		return "manterSolicitacaoServico.xhtml";
	}

	public String atenderSolicitacaoServico() {
		try {
			solicitacaoServicoBC.atenderSolicitacaoServico(solicitacaoServico, observacaoSolicitacaoServico);
			facesContext.addMessage("", new FacesMessage(FacesMessage.SEVERITY_INFO,
					"Solicitação de serviço alterada com sucesso", null));
			return "index.xhtml";
		} catch (NegocioException ne) {
			facesContext.addMessage("", new FacesMessage(FacesMessage.SEVERITY_ERROR, ne.getMessage(), null));
			return "manterSolicitacaoServico.xhtml";
		}
		
	}

	public Boolean getModoEdicao() {
		return solicitacaoServico.getId() != null && !solicitacaoServico.getEhNecessarioInformacoesAdicionais();
	}

	public Boolean getModoInclusao() {
		return solicitacaoServico.getId() == null;
	}
	
	public Boolean getModoComplementarInformacoes() {
		return solicitacaoServico.getId() != null && solicitacaoServico.getEhNecessarioInformacoesAdicionais();
	}

	public SolicitacaoServico getSolicitacaoServico() {
		return solicitacaoServico;
	}

	public void setSolicitacaoServico(SolicitacaoServico solicitacaoServico) {
		this.solicitacaoServico = solicitacaoServico;
	}

	public List<SolicitacaoServico> getListaSolicitacaoServicos() {
		return listaSolicitacaoServicos;
	}

	public void setListaSolicitacaoServicos(List<SolicitacaoServico> listaSolicitacaoServicos) {
		this.listaSolicitacaoServicos = listaSolicitacaoServicos;
	}

	public String getObservacaoSolicitacaoServico() {
		return observacaoSolicitacaoServico;
	}

	public void setObservacaoSolicitacaoServico(String observacaoSolicitacaoServico) {
		this.observacaoSolicitacaoServico = observacaoSolicitacaoServico;
	}

}
